package jwr.basic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class J18_JDBCSetup {
	// JDBC 접속 정보
	private static final String DRV = "oracle.jdbc.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@//localhost:1521/xe";
	private static final String USR = "scott";
	private static final String PWD = "TIGER";
	
	//SQL문 작성 - + 연산자 할땐 앞뒤로 띄어쓰기를 하자 
	private static final String insertSQL ="insert into sungjuk(sjno,name,kor,eng,mat) VALUES(sjno.nextval,'혜교',78,45,12)";
	private static final String selectSQL ="select * from sungjuk order by sjno desc";
//	private static final String selectSQL ="select * from dept";
	
	public static void main(String[] args) {
		// 오라클을 이용한 JDBC 프로그래밍 기초
		// 1. JDBC 드라이버를 메모리에 적재하여 객체로 생성하고 이것을 DriverManager에 등록
		// 2. DriverManager의 getConnection 메서드를 이용해서 데이터베이스 연결객체를 생성함
		// 3. PreparedStatement로 실행할 SQL문 객체를 생성
		// 4a. 실행하는 SQL문이 insert, update, delete라면 excuteUpdate()를 
		//     사용하고 실행결과는 int로 받음 - 변경된 추가된 삭제된 행의 개수를 반환
		// 4b. 실행하는 SQL문이 select라면 excuteQuery()를 
		//     사용하고 실행결과는 ResultSet으로 받음 
		// 5. ResultSet으로 받은 결과 테이블은 먼저 rs.next()로 읽어올 레코드(행)를 가리킨 후
		//    rs.getXXX(필드번호) 또는 rs.getXXX(필드이름) 으로
		//    테이블의 각 필드 값을 처리할 수 있음.
		// 6. JDBC 작업이 끝나면 연결중인 데이터베이스 
		//    접속을 끊고 관련객체 (conn, ps, rs)는 메모리에서 제거함
		
		Connection conn=null; //연결 객체 저장용
		PreparedStatement ps = null; // sql 객체 생성용
		ResultSet rs = null; // 실행결과 저장용
		
		try{
			Class.forName(DRV);    // 1.
			conn = DriverManager.getConnection(URL,USR,PWD); // 2.
//			ps = conn.prepareStatement(insertSQL);
//			int cnt = ps.executeUpdate(); // 4.
//			System.out.println(cnt+"건의 데이터 입력");
			
//			ps.close(); // 또다른 SQL문 작성하기 위해
			            // 기존 ps객체 제거
			ps = conn.prepareStatement(selectSQL);
			rs = ps.executeQuery(); // 리절트셋에 결과 저장
			
			// ResultSet에서 결과를 레코드단위로 꺼내 차례대로 출력 
			
			while(rs.next()){ // 한줄 씩 데이터를 뽑음          5.
				// ResultSet에서 읽어올 레코드가 있으면
				System.out.print("번호 ");
				System.out.print(rs.getInt(1));
				System.out.print(" 이름 : ");
				System.out.print(rs.getString("name"));
				System.out.print(" 수학 : ");
				System.out.print(rs.getInt(3));
				System.out.print(" 영어 : ");
				System.out.print(rs.getInt(4));
				System.out.print(" 국어 : ");
				System.out.print(rs.getInt(5));
				System.out.println();
				/*System.out.print("부서번호 : ");
				System.out.print(rs.getInt(1));
				System.out.print(" 부서 이름 : ");
				System.out.print(rs.getString("DNAME"));
				System.out.print(" 지역 이름 : ");
				System.out.print(rs.getString("LOC"));
				System.out.println();*/
				
			} // while
		}catch(Exception e){
			e.printStackTrace();
		} finally {
			// 6.
			// JDBC 작업이 끝난후 메모리에서 객체 제거
			if(rs != null)
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			if(ps != null)
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			if(conn!=null)
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}// try-catch
		
	} // main
} // class
